package com.lanxi.nbpaytest;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.Random;

/**
 * 时间工具类
 *
 * @author 1
 */
public class TimeUtil {
    /**
     * 默认格式
     */
    private static SimpleDateFormat defFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA);
    /**
     * 默认日期格式
     */
    private static SimpleDateFormat defDateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA);
    /**
     * 默认时间格式
     */
    private static SimpleDateFormat defTimeFormat = new SimpleDateFormat("HHmmss", Locale.CHINA);
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


    public static String getDT() {
        Date date = new Date();
        return sdf.format(date);
    }

    /**
     * 私有的构造方法
     */
    private TimeUtil() {

    }

    /**
     * 根据给定的日期格式,格式化日期时间
     *
     * @param sdf  格式对象
     * @param date 日期时间
     * @return
     */
    public static String format(SimpleDateFormat sdf, Date date) {
        return sdf.format(date);
    }

    /**
     * 根据给定的日期格式表达式,格式化日期时间
     *
     * @param regex 格式表达式
     * @param date  日期时间
     * @return
     */
    public static String format(String regex, Date date) {
        return new SimpleDateFormat(regex).format(date);
    }

    /**
     * 根据给定的日期格式,将字符串转日期时间
     *
     * @param sdf  格式化对象
     * @param date 字符串形式日期时间
     * @return
     */
    public static Date parse(SimpleDateFormat sdf, String date) {
        try {
            return sdf.parse(date);
        } catch (ParseException e) {

        }
        return null;
    }

    /**
     * 根据给定的日期格式表达式,将字符串转日期时间
     *
     * @param regex 格式表达式
     * @param date  字符串形式日期时间
     * @return
     */
    public static Date parse(String regex, String date) {
        try {
            return new SimpleDateFormat(regex).parse(date);
        } catch (ParseException e) {

        }
        return null;
    }

    /**
     * 使用默认日期格式,生成日期字符串
     *
     * @param date 日期
     * @return
     */
    public static String formatDate(Date date) {
        return format(defDateFormat, date);
    }

    /**
     * 使用默认时间格式,生成时间字符串
     *
     * @param time 时间
     * @return
     */
    public static String formatTime(Date time) {
        return format(defTimeFormat, time);
    }

    /**
     * 使用默认格式格式化日期时间为字符串
     *
     * @param date
     * @return
     */
    public static String formatDateTime(Date date) {
        return format(defFormat, date);
    }

    /**
     * 使用默认时间格式,将字符串形式日期转为日期
     *
     * @param date 字符串形式日期
     * @return
     */
    public static Date parseDate(String date) {
        return parse(defDateFormat, date);
    }

    /**
     * 使用默认时间格式,将字符串形式时间转为时间
     *
     * @param time 字符串形式时间
     * @return
     */
    public static Date parseTime(String time) {
        return parse(defTimeFormat, time);
    }

    /**
     * 使用默认格式格式化字符串为日期时间
     *
     * @param dateTime
     * @return
     */
    public static Date parseDateTime(String dateTime) {
        return parse(defFormat, dateTime);
    }

    /**
     * 获取当前日期(字符串)
     *
     * @return
     */
    public static String getDate() {
        return format(defDateFormat, new Date());
    }

    /**
     * 获取当前时间(字符串)
     *
     * @return
     */
    public static String getTime() {
        return format(defTimeFormat, new Date());
    }

    /**
     * 获取当前时间日期
     *
     * @return
     */
    public static String getDateTime() {
        return format(defFormat, new Date());
    }

    /**
     * 日期 时间 拼成 日期+时间
     *
     * @param date
     * @param time
     * @return
     */
    @SuppressWarnings("deprecation")
    public static Date getDateTime(Date date, Date time) {
        return new Date(date.getYear(), date.getMinutes(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds());
    }

    /**
     * 日期 时间 字符串 拼成 日期+时间字符串
     *
     * @param date
     * @param time
     * @return
     */
    public static String getDateTimeStr(String date, String time) {
        return date + time;
    }

    /**
     * 日期 时间 字符串 拼成 日期+时间
     *
     * @param date
     * @param time
     * @return
     */
    public static Date getDateTime(String date, String time) {
        return parse(defFormat, getDateTimeStr(date, time));
    }

    /**
     * 日期 时间  拼成 日期+时间字符串
     *
     * @param date
     * @param time
     * @return
     */
    public static String getDateTimeStr(Date date, Date time) {
        return format(defFormat, getDateTime(date, time));
    }

    /**
     * 设置默认日期时间格式
     *
     * @param format
     */
    public static void setDefFormat(String format) {
        defFormat = new SimpleDateFormat(format);
    }

    /**
     * 设置默认日期格式
     *
     * @param format
     */
    public static void setDefDateFormat(String format) {
        defDateFormat = new SimpleDateFormat(format);
    }

    /**
     * 设置默认时间格式
     *
     * @param format
     */
    public static void setDefTimeFormat(String format) {
        defTimeFormat = new SimpleDateFormat(format);
    }


    public static String getCurrentTimeAddYear(String time, int addYear) throws ParseException {
        Date date = defDateFormat.parse(time);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.YEAR, +addYear);
        date = calendar.getTime();
        String format = defDateFormat.format(date);
        return format;
    }

    public static String getPrimaryId() {
        String dateTime = String.valueOf((new Date()).getTime());
        Random random = new Random();
        int randomNumber = random.nextInt(9000) + 1000;
        String randomNumber_str = String.valueOf(randomNumber);
        return dateTime + randomNumber_str;
    }

    public static String getCurrentSystemUnixTime() {
        long l = System.currentTimeMillis() / 1000;
        String unixTime = String.valueOf(l);
        return unixTime;
    }


    /**
     * yyyyMMddHHmmss日期格式
     */
    public static SimpleDateFormat sdfYmdHms = new SimpleDateFormat("yyyyMMddHHmmss");

    public static String getCurrentyyyyMMddHHmmss() {
        return sdfYmdHms.format(new Date());
    }

    /**
     * 获取当前时间多少天之前的日期
     *
     * @param i
     * @return
     */
    public static String getDateAgo(int i) {
        Date date = new Date();

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(calendar.DATE, -i);
        date = calendar.getTime();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        String dateString = format.format(date);
        return dateString;
    }


    public static String getMonthAfter(int i) {
        Date date = new Date();

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(calendar.MONTH, i);
        date = calendar.getTime();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        String dateString = format.format(date);
        return dateString;
    }

    /**
     * 得到指定时间，多少分钟之后的时间
     *
     * @param date   指定时间，格式yyyyMMddHHmmss
     * @param second 指定分钟的值，例如：传入1得到一分钟之后的时间
     * @return
     * @throws ParseException
     */
    public static String getAfterMinyteTime(String date, int second) throws ParseException {
        Date parse = defFormat.parse(date);
        Date Before = new Date();
        Calendar calendar = Calendar.getInstance(); //得到日历
        calendar.setTime(parse);//把当前时间赋给日历
        calendar.add(calendar.MINUTE, second);
        Before = calendar.getTime();   //指定分钟之后的时间
        String defaultStartDate = defFormat.format(Before);//格式化后的时间
        return defaultStartDate;
    }

    /**
     * 时间戳转换成日期格式字符串
     *
     * @param seconds   精确到秒的字符串
     * @param formatStr
     * @return
     */
    public static String stampToDate(String seconds, String formatStr) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatStr);
        long lt = new Long(seconds);
        Date date = new Date(lt);
        String dateStr = simpleDateFormat.format(date);
        return dateStr;
    }


    public static void main(String[] args) throws ParseException {

//        System.out.println(getDateAfter(6));
    }


}
